#include <iostream>
#include <vector>
#include "UtilidadesSVG.h"
#include "Circulo.h"
#include "Rectangulo.h"
#include "GrupoFiguras.h"
#include "Poligono.h"
#include "ExcepcionSVG.h"

using namespace std;

IDibujable*
UtilidadesSVG::crearFigura(string descripcion,istream & is)
{
	IDibujable *f=NULL;
	if(descripcion == "Circulo")
	{
		f=new Circulo();
		f->leeEntrada(is);
	}
	else if(descripcion == "Rectangulo")
	{
		f=new Rectangulo();
		f->leeEntrada(is);
	}
	else if (descripcion=="Poligono")
	{
		f=new Poligono();
		f->leeEntrada(is);
	}
	
	else throw ExcepcionFiguraDesconocida(descripcion);
	
	return f;
}

void 
UtilidadesSVG::hacerOperacion(vector<IDibujable*>& fig,istream& is)
{
	string operacion="";
	int idfigura,cx,cy;
	float porcentaje;
	int pos,num;
	string descripcion,des;
	bool sal = false;

	is>>operacion;
	try
	{
		if(operacion == "mover")
		{
			is>>idfigura;
			is>>cx;
			is>>cy;
			Coordenada c(cx,cy);
			if(idfigura>0 && (idfigura-1)<(int)fig.size())
			{
				fig[idfigura-1]->mover(c);
			}
		}
		else if(operacion == "escalar")
		{
			
			is>>idfigura;
			if(idfigura>0 && (idfigura-1)<=(int )fig.size())
			{
				is>>porcentaje;//
				try
				{
					fig[idfigura-1]->escalar(porcentaje);
				}
				catch (ExcepcionValorNoValido& ex)
				{
					cerr<<ex.what();
				}
			}
		}
		else if(operacion == "agrupar")
		{
			pos=num=0;
			GrupoFiguras* gf=NULL;
			is>>num;//numero de figuras a agrupar
			vector <Figura2D*>p;
			vector <int> aux;
			int i=0;
			while((int)aux.size()<num)
			{
				is>>pos;
				aux.push_back(pos-1);
				p.push_back((Figura2D*)fig[aux[i]]);
				i++;
			}
			
			descripcion=des="";
			getline(is,descripcion);
			int longitud = descripcion.length();
			//Codigo para quitar espacios delanteros
			for(int x=0;x<longitud;x++)
			{
				if(descripcion[x]!=' ' && !sal)
				{
					des+=descripcion[x];
					sal=true;
				}
				else if(sal)
				{
					des+=descripcion[x];
				}
			}
			try
			{
				gf=new GrupoFiguras(p,des);
				fig.push_back(gf);
			}
			catch(ExcepcionValorNoValido& ex)
			{
				cerr<<ex.what();
				delete gf;	
			}
		}
		
		else if(operacion == "eliminar")
		{
			is>>idfigura;
			
			if(idfigura>0 && idfigura<=(int)fig.size())
			{
				if (dynamic_cast<Figura2D*>(fig[idfigura-1]))
				{
					delete fig[idfigura-1];
					fig.erase(fig.begin()+(idfigura-1));//borra del array la posicion que le dices
				}
				else if (dynamic_cast<GrupoFiguras*>(fig[idfigura-1]))
				{
					delete fig[idfigura-1];
					fig.erase(fig.begin()+(idfigura-1));//borra del array la posicion que le dices
				}
			}
		}
		else if(operacion=="duplicar")
		{
			is>>idfigura;
			if(idfigura>0 && (idfigura-1)<(int)fig.size())
			{
				is>>cx>>cy;
				Coordenada c(cx,cy);
				if (dynamic_cast<Figura2D*>(fig[idfigura-1]))
				{
					Figura2D* s=((Figura2D*)fig[idfigura-1]);
					Figura2D* m=s->duplicar(c);
					fig.push_back(m);
				}
				else if (dynamic_cast<GrupoFiguras*>(fig[idfigura-1]))
				{	
					Figura2D* n;
					GrupoFiguras* s=((GrupoFiguras*)fig[idfigura-1]);
					GrupoFiguras* m=s->duplicar(c);
				
					for (int i = 1; i <= m->getNumFiguras(); i++)
					{
						n= &m->getFigura(i);
						fig.push_back(n);
						
					}
					fig.push_back(m);
				}
				
			}
		}
		else if (operacion=="ocultar")
		{
			is>>idfigura;
			if(idfigura>0 && (idfigura-1)<=(int )fig.size())
			{
				try
				{
					fig[idfigura-1]->ocultar(true);
				}
				catch (ExcepcionValorNoValido& ex)
				{
					cerr<<ex.what();
				}
			}
		}
		else if (operacion=="mostrar")
		{
			cout<<operacion<<endl;
			is>>idfigura;
			if(idfigura>0 && (idfigura-1)<=(int )fig.size())
			{
				try
				{
					fig[idfigura-1]->ocultar(false);
				}
				catch (ExcepcionValorNoValido& ex)
				{
					cerr<<ex.what();
				}
			}
		}
	}
	catch (ExceptionOperacionDesconocida& ex)
	{
		cerr<<ex.what();
	}
}



